# 计算力学结果
import math
from typing import List
from algs.common import OilWellData
from common.params import SoftParams


class ForceResult:
    depth: float
    force: float
    low_weak_force: float
    high_weak_force: float
    # rate%
    seventy_force: float


class UniForceResult:
    # 深度
    depth: float
    # 张力
    F_pull: float
    F_push: float
    # F h
    F_weak_high: float
    # F l
    F_weak_low: float
    # F rate
    F_weak_rate_low: float
    # 正压力
    N_pull: float
    N_push: float
    # N h
    N_weak_high: float
    # N l
    N_weak_low: float
    # N rate%
    N_weak_rate_low: float
    # 压力求和
    N_sum: float


# 计算力学结果
class AverageResult:
    depth: float
    inclination_average: float


# 计算参数
class AxialForceResult:
    # 测井深度
    depth: float
    # 倾斜角
    inclination: float
    # 井斜角变化率
    inclination_rate: float
    # 方位角
    azimuth: float
    # 方位角变化率
    azimuth_rate: float
    # # 狗腿度
    dog_leg_severity: float
    # 弯矩
    bending_moment: float
    #########################################
    # 条件绘图参数
    # 正压力 默认的 pull
    # N_pull: float
    # # push 时候的正压力
    # N_push: float
    # N h
    N_weak_high: float
    # N l
    N_weak_low: float
    # N rate%
    N_weak_rate_low: float


    # 张力 默认的 pull
    # F_pull: float
    # # push 时候的张力
    # F_push: float
    # F h
    F_weak_high: float
    # F l
    F_weak_low: float
    # F rate
    F_weak_rate_low: float


    F: float
    N: float

# 基础参数
class BaseRodParams:
    # 工具长度
    L1: float
    # 测井工具外径
    d1: float
    # 测井工具在空气中的重量 kg/m3
    m1: float
    # 流体密度
    rou_m: float
    # 工具摩擦系数
    mu1: float
    # 电缆外径
    d2: float
    # 电缆在空气中的重量
    m2: float
    # 电缆摩擦系数
    mu2: float
    # 拉断力
    F_break: float
    # 张力计算参数
    F_weak_high: float
    F_weak_low: float
    F_weak_rate_low: float


# 公共函数
# 数据初始化
def data_init(_list_: List[OilWellData]) -> List[AxialForceResult]:
    result_arr: List[AxialForceResult] = []
    for item in _list_:
        t: AxialForceResult = AxialForceResult()
        t.depth = item.depth
        t.inclination = item.inclination
        t.azimuth = item.azimuth
        t.dog_leg_severity = item.dog_leg_severity
        t.inclination_rate = math.radians(item.inclination_rate) / 30
        t.azimuth_rate = math.radians(item.azimuth_rate) / 30
        result_arr.append(t)
    return result_arr


def get_test_params() -> BaseRodParams:
    params: BaseRodParams = BaseRodParams()
    params.d1 = 0.09
    params.m1 = 27.67
    params.rou_m = 1300
    params.L1 = 15
    params.mu1 = 0.28
    params.d2 = 0.0118
    params.m2 = 0.5
    params.mu2 = 0.28
    params.F_break = 89
    params.F_weak_low = 33687.54
    params.F_weak_high = 35728.02
    params.F_weak_rate_low = 23581.278
    return params


def get_instrument_area(params: SoftParams) -> float:
    return math.pi * 0.25 * math.pow(params.d1, 2)


# 测井仪器的单位密度
def get_instrument_uint_density(params: SoftParams) -> float:
    return params.m1 / get_instrument_area(params)


# 测井仪器的单位浮重
def get_instrument_unit_weight(params: SoftParams) -> float:
    return (get_instrument_uint_density(params) - params.rou_m) * get_instrument_area(params) * 9.81


# 电缆截面面积
def get_cable_area(params: SoftParams) -> float:
    return math.pi * 0.25 * math.pow(params.d2, 2)


# 电缆的单位密度
def get_cable_uint_density(params: SoftParams) -> float:
    return params.m2 / get_cable_area(params)


# 电缆的单位浮重
def get_cable_unit_weight(params: SoftParams) -> float:
    return (get_cable_uint_density(params) - params.rou_m) * get_cable_area(params) * 9.81
